//6．设计一个位字段结构以储存下面的信息。　
//字体ID：0～255之间的一个数；　　
//字体大小：0～127之间的一个数；　　
//对齐：0～2之间的一个数，表示左对齐、居中、右对齐；　　
//加粗：开（1）或闭（0）；
//斜体：开（1）或闭（0）；
//下划线：开（1）或闭（0）；
//在一个程序中使用该结构来打印字体参数，并使用循环菜单来让用户改变参数。
//例如，该程序的一个运行示例如下：
//该程序要使用按位与运算符（&）和合适的掩码来把字体ID和字体大小信息转换到指定的范围内。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <mylib.h>

#define ID_MASK 0x7f
#define SIZE_MASK 0xff

typedef struct font {
    unsigned int id:        8;
    unsigned int size:      7;
    unsigned int alignment: 2;
    unsigned int bold:      1;
    unsigned int italic:    1;
    unsigned int underline: 1;
} FONT;
enum alignment {
    left, center, right
};

static char choice_menu(FONT *font);

int main(void) {
    FONT font = {1, 12, left, false, false, false};
    char sel;
    while ((sel = choice_menu(&font)) != 'q') {
        switch (sel) {
            case 'f':
                printf("Enter font id(0-255):");
                font.id = get_range_i(0, 255) & ID_MASK;
                break;
            case 's':
                printf("Enter font size(0-127):");
                font.size = get_range_i(0, 127) & SIZE_MASK;
                break;
            case 'a':
                printf("Select alignment:\n"
                       "1)left\t2)center\t3)right\n");
                font.alignment = get_range_i(1, 3)-1;
                break;
            case 'b':
                font.bold = !font.bold;
                break;
            case 'i':
                font.italic = !font.italic;
                break;
            case 'u':
                font.underline = !font.underline;
                break;
        }
    }
    printf("Bye!");
    return 0;
}

static char choice_menu(FONT *font) {
    //打印当前信息
    puts("ID\tSIZE\tALIGNMENT\tB\tI\tU");
    char align[7];
    switch (font->alignment) {
        case left:
            strcpy(align, "left");
            break;
        case center:
            strcpy(align, "center");
            break;
        case right:
            strcpy(align, "right");
            break;
    }
    printf("%d\t%d\t\t%s\t\t%s\t%s\t%s\n\n", font->id, font->size, align,
           font->bold ? "on" : "off",
           font->italic ? "on" : "off",
           font->underline ? "on" : "off");

    //打印菜单
    puts("f)change font\ts)change size\ta)change alignment\t");
    puts("b)toggle bold\ti)toggle italic\tu)toggle underline\t");
    puts("q)quit");
    const int st_size = 10;
    char st[st_size];
    char chs[] = "f|s|a|b|i|u|q";
    while (s_gets(st, st_size) == NULL || strchr(chs, st[0]) == NULL) {
        printf("输入%s\n", chs);
    }
    return st[0];
}
